package com.net.core.utils;

import lombok.extern.slf4j.Slf4j;

import java.text.DecimalFormat;

/**
 * @Author zll
 * @Date 2021-07-15 15:40
 * @Version 1.0
 * @Describe todo
 */
@Slf4j
public class JVMUtils {


    public static String toM(long byteNum) {
        float m = byteNum / (1024f * 1024f * 1024f);
        DecimalFormat decimalFormat = new DecimalFormat("0.00");
        String format = decimalFormat.format(m);
        return format + "G";
    }

    public static String jvmInfo() {
        long max = Runtime.getRuntime().maxMemory();
        long free = Runtime.getRuntime().freeMemory();
        long total = Runtime.getRuntime().totalMemory();

//        OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean();
//        long totalMemorySize = osmxb.getTotalPhysicalMemorySize();
//        long freeMemorySize = osmxb.getFreePhysicalMemorySize();
//        long usedMemorySize = (osmxb.getTotalPhysicalMemorySize() - osmxb.getFreePhysicalMemorySize()) ;
//        log.info(String.format("系统最大内存:%s 系统空闲内存:%s 系统使用内存:%s ",toM(totalMemorySize),toM(freeMemorySize),toM(usedMemorySize)));
        return String.format("最大可分配内存:%s 当前分配内存:%s 空闲内存:%s 使用内存%s", toM(max), toM(total), toM(free), toM(total - free));
    }

    public static void jvmPrintWarnInfo() {
        long max = Runtime.getRuntime().maxMemory();
        long free = Runtime.getRuntime().freeMemory();
        long total = Runtime.getRuntime().totalMemory();
        float use = total - free;
        if(use / max>0.8){
            log.error(String.format("最大可分配内存:%s 当前分配内存:%s 空闲内存:%s 使用内存%s", toM(max), toM(total), toM(free), toM(total - free)));
        }else {
            log.info(String.format("最大可分配内存:%s 当前分配内存:%s 空闲内存:%s 使用内存%s", toM(max), toM(total), toM(free), toM(total - free)));
        }
    }
}
